0x00 前言
在内网渗透的信息收集中,机器服务探测一般都是通过端口扫描去做的,但是有些环境不允许这些操作。通过利用 SPN 扫描可快速定位开启了关键服务的机器,这样就不需要去扫对应服务的端口,有效规避端口扫描动作。
Kerberoasting 是域渗透中经常使用的一项技术,是通过爆破 TGS-REP 实现。
0x01 关于 SPN
服务主体名称(SPN: Service Principal Names)是服务实例,可以将其理解为一个服务(比如 HTTP、MSSQL)的唯一标识符,服务在加入域中时是自动注册的。
如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个 SPN。SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机名称或别名注册 SPN。
如果用一句话来说明的话就是如果想使用 Kerberos 协议来认证服务,那么必须正确配置 SPN。
SPN 可以分为两种:
- 注册在域内机器账户(
Computers)上 - 注册在域内用户账户(
Users)下
0x02 SPN 标准格式
在 SPN 语法中存在 4 种元素,两个必须元素和两个格外元素。其中 <service class> 和 <host> 为必需元素。
1 | <service class>/<host>:<port> <servername> |
0x03 使用 SetSPN 为机器(域用户)创建 SPN
命令语法类似如下:
1 | Setspn -S http/<computername>.<domainname> <domain-user-account> |
-S 参数:验证不存在重复项后,添加随意 SPN。注意: -S 从 Windows Server 2008 开始系统默认提供。
此处以 Web 服务器为例。
- 以
web 用户运行Web 服务器 - 域管理员权限运行
cmd
1 | Setspn -s http/WebDemo_PC.rcoil.me rcoil\web |
结果如下:

0x04 借助 SetSPN 对域内相关服务进行查询
4.1、查询域内 MSSQL 数据库服务器
使用第 3 点中的对照表快速查询
1 | setspn -T rcoil.me -Q */* | findstr "MSSQLSvc" |
4.2、相关查询 C# 源码
1 | using System; |
自行添加需要的服务即可,更多的服务写在了备注中。
4.3、相关原理说明
在 SPN 扫描时我们可以直接通过脚本,或者命令去获悉内网已经注册的 SPN 内容
LDAP 协议全称是 Lightweight Directory Access Protocol,一般翻译都是翻译成 轻量目录访问协议。通俗点可以把 LDAP 协议理解为一个关系型数据库,其中存储了域内主机的各种配置信息。
在域控中默认安装有 ADSI 编辑器,它是 LDAP 的编辑器,可以通过在域控中运行 adsiedit.msc 来打开。

我们的 SPN 查询,实际上就是就是查询 LDAP 中存储的内容。(以后会通过别的章节详细介绍 LDAP 协议)
下图是 4.2 中 MSSQL 查询的结果,协议为 LDAP。

4.4、更多扫描工具
扫描工具有很多,但是只要知道原理就不会觉得太难。
1 | Discover-PAMSSQLServers(Powershell-AD-Recon) |
0x05 获取当前目标域中所有以域用户身份起服务的 SPN
查询以域用户身份起的服务,主要是为了后续 Kerberoast做准备。
- 现成工具
1 | cscript.exe GetUserSPNs.vbs |
C# 代码(其实就是查询LDAP):
1 | public static void GetUserSPN(string RootDSE) |
结果如下:

0x06 Kerberoast (Kerberos TGS服务票据(Service Ticket)离线爆破)
6.1、申请 TGS
powershell
1 | PS>Add-Type -AssemblyName System.IdentityModel |
C#
1 | public KerberosRequestorSecurityToken (string servicePrincipalName); |
这一整个过程是通过 AS-REQ、AS-REP、TGS-REQ、TGS-REP 这四个认证流程,最终获取到 RC4方式的加密票据。
6.2、获取 TGS-REP
Kerberos 协议中请求的票据会保存在内存中,可以通过 klist 命令查看当前会话存储的 kerberos 票据。

使用
mimikatz的kerberos::list /export导出。SharpRost(如今的Rubeus)
Invoke-kerberoast的-outputformat,选择 hashcat 格式。综合以上代码,新建项目,项目地址: SPNSearcher
6.3、爆破 TGS-REP
此处爆破的是HTTP/WebDemo_PC.rcoil.me
可选择工具(工具始终是工具,看的是字典强不强):1
2tgsrepcrack.py(kerberoast套装)
hashcat(密码破解全能工具,kali自带)


0x07 Kerberoasting 的后门利用
在我们取得了 SPN 的修改权限后,可以为指定的域用户添加一个 SPN,这样可以随时获得该域用户的 TGS ,经过破解后获得明文口令。
0x08 参考
为报表服务器注册服务主体名称 (SPN)
KerberosRequestorSecurityToken(String)
从 Kekeo 到 Rubeus
域渗透——Kerberoasting